/*******************************************************************************
  * 文件：Hardware_PWM.c
  * 作者：yk
  * 版本：v1.0.0
  * 日期：2024-03-18
  * 说明：定时器相关
*******************************************************************************/

/* 头文件 *********************************************************************/
#include "Hardware_PWM.h"
#include "lib_config.h"

/*******************************************************************************
  * 函数名: T16N1Init
  * 功  能：T16N1初始化
  * 参  数：无
  * 返回值：无
  * 说  明：
*******************************************************************************/
static void T16N1Init(void)
{
    TIM_BaseInitStruType x;

    memset(&x,0,sizeof(x));
    
    // 设置定时器参数
    x.TIM_ClkS = TIM_ClkS_PCLK;
    x.TIM_SYNC = DISABLE;
    x.TIM_EDGE = TIM_EDGE_Rise;
    x.TIM_Mode = TIM_Mode_PWM;
    T16Nx_BaseInit(T16N1,&x);

    T16N1_Disable();
}

/*******************************************************************************
  * 函数名: Hardware_PWM_ParaInit
  * 功  能：初始化PWM设置的参数
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_PWM_ParaInit(void)
{
    T16Nx_PWMInitStruType x;
    memset(&x,0,sizeof(x));

    // 设置PWM参数
    T16Nx_MAT2Out1Config(T16N1, TIM_Out_High);
    T16Nx_MAT3Out1Config(T16N1, TIM_Out_Low);

    x.T16Nx_MOE1 = ENABLE;
    x.T16Nx_POL1 = POSITIVE;                // 端口默认电平为0
    T16Nx_PWMOutConfig(T16N1, &x);          // 配置输出

    T16Nx_SetPREMAT(T16N1, 16);             //预分频
    T16Nx_SetCNT(T16N1, 0); 
    NVIC_Init(NVIC_T16N1_IRQn, NVIC_Priority_1, DISABLE);

    T16Nx_MAT2ITConfig(T16N1, TIM_Go_Int);              //匹配0：继续计数
    T16Nx_MAT3ITConfig(T16N1, TIM_Go_Int);              //匹配1：继续计数

    T16Nx_ITConfig(T16N1, TIM_IT_MAT2, DISABLE);        //可选择是否使能中断
    T16Nx_ITConfig(T16N1, TIM_IT_MAT3, DISABLE);
}


/*******************************************************************************
  * 函数名: Hardware_PWM_Config
  * 功  能：设置PWM的控制参数(频率和占空比)
  * 参  数：U16 u16Freq: 频率
  *        U16 u16Duty: 占空比 -- 1-100
  * 返回值：无
  * 说  明：T16N_TOP计数峰值寄存器表示周期，16MHz时钟16分频，1个计数值为1us
*******************************************************************************/
void Hardware_PWM_Config(U16 u16Freq, U16 u16Duty)
{
    U16 u16Period = 0;    // 周期(us)
    U16 u16Mat = 0;       // 

    u16Period = (U16)((U32)(1000000) / (U32)u16Freq);
    if(u16Period <2)
    {
        u16Period = 2;
    }

    // 控制周期
    T16Nx_SetTOP(T16N1, u16Period - 1);

    u16Mat = (U16)((U32)(10000) * (U32)u16Duty / (U32)u16Freq);

    //控制占空比，计数值为0开始输出高电平
	  T16Nx_SetMAT2(T16N1, 0);

    //控制占空比，开始输出低电平
    T16Nx_SetMAT3(T16N1, u16Mat);
}

/*******************************************************************************
  * 函数名: Hardware_PWM_Stop
  * 功  能：停止PWM输出
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_PWM_Stop(void)
{
    T16N1_PwmOut1_Disable();
    T16N1_Disable();
}

/*******************************************************************************
  * 函数名: Hardware_PWM_Start
  * 功  能：开始PWM输出
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_PWM_Start(void)
{
    T16N1_PwmOut1_Enable();
    T16N1_Enable();
}



void Hardware_PWM_Init(void)
{   
    // 初始化PWM参数
    T16N1Init();
    Hardware_PWM_ParaInit();

}
